(for Internet Explorer)
Function  find( keyword as string, path as string ) as string
テキストファイルの中で、指定したキーワードを含む行をまとめて返します。
【引数】
keyword
検索するキーワード
キーワードを含む行、または複数行
返り値
path
テキストファイルのパス
(src)
サンプル:
  lines = find( "<ERROR", "Test_logs.txt" )
Test_logs.txt ファイルのサンプル
start main.vbs
<ERROR msg='not found symbol'/>
Fail.
返り値のサンプル
<ERROR msg='not found symbol'/>
関連
Function  find_c( keyword as string, path as string ) as integer
テキストファイルの中で、指定したキーワードを含む行数を返します。
【引数】
keyword
path
検索するキーワード
テキストファイルのパス
キーワードを含む行数
返り値
(src)
テスト
→ T_fc.vbs
Function  SearchStringTemplate( FolderPath as string, RegularExpressionPart as string,
   TemplateStrings as array of string, Opt as Empty ) as array of array of GrepFound
テキストファイルの中をキーワードで検索し、どのテンプレートと一致するかを一覧します。
【引数】
FolderPath
RegularExpressionPart
検索対象フォルダーやワイルドカード
テンプレートの中にあるキーワード。複数行不可
TemplateStrings
テンプレート(複数行可)、または、その配列
返り値
の配列の配列
→ ToolsLib.vbs
ソース
T_SearchStringTemplate
関連
    founds = SearchStringTemplate( "TargetFolder", "(((", _
        "/***********" +vbCRLF+ _
        "((( ${FunctionName} ))$\{)" +vbCRLF+ _
        "************/" +vbCRLF, Empty )

    Assert  founds(0)(0).LineNum = 1  '// マッチした
    Assert  founds(0)(1).LineNum = 5  '// マッチした
    Assert  founds(1)(0).LineNum = 9  '// マッチしなかった
サンプル
TargetFolder フォルダーの中にあるテキストファイルの中から "(((" を検索し、見つかった
位置に、テンプレート(下記の複数行の文字列) がマッチしているものと、マッチしていない
ものに分けます。
/***********
((( FuncA ))${)
************/

/***********
((( FuncB ))${)
************/

/***********
((( FuncC )))
************/
検索対象のテキストファイル
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
… RegularExpressionPart 引数に指定した ((( にヒットするが、
  テンプレートに指定した ${ がないのでマッチしない
キーワードが見つかった位置が、指定したテンプレートの一部であるものと、そうでないものを
一覧します。 これを応用すれば、テンプレートの内容が違っていたり、古いテンプレートのまま
になっていたりするものを見つけることができます。
テンプレートは、可変の部分を "${変数名}" のように記述してください。 可変の部分は、複数行
にまたぐことができます。 SearchStringTemplate 関数はテンプレートの中の変数名を無視しま
すが、テンプレートを ScanFromTemplate 関数などにそのまま渡すことができます。
${ 文字は "$\{" と記述してください。 $\ 文字は "$\\" と記述してください。
関数名: ${FunctionName}
引数:   ${Arguments}
返り値: ${RerutnValue}
Opt
Empty を指定してください
返り値が founds のとき、founds(t)(i) の t は TemplateStrings 引数の配列番号、i はテンプレート
にマッチした複数の場所に 0 から順番につけた番号です。

i が配列の要素数に一致する要素は、TemplateStrings 引数に指定したどのテンプレートにも
マッチしなかったテキストについてです。
返り値
TemplateStrings 引数
配列の要素は、
です。
GrepFound オブジェクトのメンバー変数の内容は、次の通りです。
.Path
.LineNum
.LineText
ファイル名
Empty
Array( テンプレートの開始位置(1以上), テンプレートの次の位置 )
GetEchoStr に渡すと、次のように変わります。
テンプレートにマッチしたファイルの中の内容。 複数行の場合あり
行番号。 キーワードがある位置の行番号
ファイル名
.LineText
.LineNum
.Path
が使えます。
Function  GetLineNumOfTemplateDifference( TargetString as string,
    RegularExpressionPart as string, TemplateString as string ) as integer
指定した文字列の中で、テンプレートに一致しない場所の行番号を返します。
【引数】
TargetString
RegularExpressionPart
テンプレートが含まれる(はずの)文字列
テンプレート(複数行可)
TemplateString
テンプレートの書き方について、
line_num = GetLineNumOfTemplateDifference( _
      "----" +vbCRLF+_
      "----" +vbCRLF+_
      "Parameter1: abc" +vbCRLF+_
      "Param2:     def" +vbCRLF+_
      "Parameter3: ghi" +vbCRLF+_
      "----" +vbCRLF, _
      _
      "Parameter1", _
      _
      "Parameter1: ${1}" +vbCRLF+_
      "Parameter2: ${2}" +vbCRLF+_
      "Parameter3: ${3}" +vbCRLF )

Assert  line_num = 4  '// Param2: の場所の行番号
サンプル
テンプレートに一致しない場所の行番号。 0=すべて一致
返り値
テンプレートの中にあるキーワード。複数行不可
→ ToolsLib.vbs
ソース
→ T_fc.vbs
テスト
T_GetLineNumOfTemplateDifference
関連
Function  CreateFile( path as string, text as string ) as string
指定のテキストを内容としたテキストファイルを作成します。
【引数】
path
text
作成するテキストファイルのパス
テキストファイルの内容
(src)
text に指定した文字列の末尾に改行が自動的に入らないテキストが作成されます。
カレントフォルダに a.txt ファイルを作る
CreateFile  "a.txt", "ABC"
返り値
作成したテキストファイルのフル・パス
path に相対パスを指定したとき、基準フォルダはカレント・フォルダになりますが、ワイルド
カードが含まれていると、テンポラリ・フォルダになります。 詳しくは、
start  CreateFile( "*.xml", obj.xml )
obj
obj の xml プロパティを、テンポラリファイルに出力して開く
関連
を使うと、テキストファイルのフォーマットを指定できます。
→ T_File.vbs [T_CreateFile]
テスト
を使うと、内部で
を使います。
参考
→ FileT_create (clib)
mini (src)
→ T_File.vbs [T_CreateFile_Err]
サンプル
サンプル
サンプル
path = "_work.txt"
text = ReadFile( path )
'// ここで text を変更
Set cs = new_TextFileCharSetStack( ReadUnicodeFileBOM( path ) )
CreateFile  path, text
cs = Empty
補足
Unicode 形式かどうかを維持してファイルの内容を変更する
注意
下記の方法より、
を変更する方が扱いやすいでしょう。
この警告が出る最も多い原因は、ユーザが設定した場所に書き込み許可を設定しなかった
スクリプトのバグです。 スクリプト開発者は、
[WARNING] Out of Writable, see "Out of Writable" in vbslib manual.
 "C:\home\scriptlib\vbslib_new\_src\Test\vbslib_test\T_Writable\work2"
スクリプトが想定していない場所に、ファイルを出力しようとしたとき、出力してよいかユーザに
確認を取ります。
コマンドプロンプトへの出力例:
確認ウィンドウ:
を使ってください。
vbslib を使ったスクリプトは、ダブルクリックした .vbs ファイルがあるフォルダ、または、ユーザが
設定した場所のフォルダのどちらかしか、ファイルを作成したり削除しないように作られます。
このルールが守られなかったとき、警告が出ます。

この機能は、スクリプト開発者のミスによって問題が起きないようにするためのものであり、
悪意のあるスクリプトは、この警告を出さないでファイルを壊すこともあります。
デバッガでスクリプトを起動し、Out of Writable の警告で、プログラムの終了やキャンセルを
選ぶと、例外によりブレークします。
      Err.Raise  E_OutOfWritable,, "Out of Writable """ & CheckPath & """"
      ' Watch  g_CurrentWritables.CurrentPathes and CheckPath
g_CurrentWritables.CurrentPathes や CheckPath をウォッチウィンドウでチェックしてください。
コールツリー
mkdir など
g_AppKey.CheckWritable
m_Key.CheckWritable
g_CurrentWritables.CheckWritable
m_Key.CheckPlusWritable
"...\*" 以外のチェック
"...\*" で追加されたものと比較
m_Key.Ask
警告の表示
m_PlusWritables( UBound( m_PlusWritables ) ) = abs_path
Writable を追加
隠しキーのメソッド
公開キーのメソッド
テスト
グローバル変数のデストラクタでファイル操作をすると、メイン関数で作成した Writables
オブジェクトが削除された後なので、必ず警告が発生します。
If IsEmpty( abs_path ) Then  Exit Sub
Writable の中なので OK
AppKey.NewWritable
Writables::SetPathes
m_Pathes( UBound( m_Pathes ) ) = g_TempFile.m_FolderPath + "\"
m_Pathes(i) = abs_path + "\"
Writable の登録
テンポラリを Writable に登録
g_CurrentWritables.AskFileAccess
Writables::Enable
WritablesStack::PushPathes
CurrentWritables::PushPathes
m_PathesStack.Push
Writable を有効にする
をばらまいてください。
Writable の状況を確認したいときは、
AppKeyClass::Ask
の中と、拡張子が .updating のパスについては、NewWritable を
使う必要はありません。
Function  AppKeyClass::NewWritable( Pathes as variant ) as Writables
Sub  Main( Opt, AppKey )
    Set w_= AppKey.NewWritable( "." ).Enable()
        '// 書き込み可能な範囲
    w_ = Empty  '// これを書かないときは、関数が終わるまでが範囲
End Sub
サンプル1: カレントフォルダを書き込み可能にする
サンプル: 後で out フォルダを書き込み可能にする
Sub  Main( Opt, AppKey )
  Set wr = AppKey.NewWritable( "out" )

  sub2  wr
End Sub

Sub  sub2( wr )
  Set w_ = wr.Enable()
    '// "out" に書き込み可能な範囲
End Sub
書き込み可能なフォルダの設定オブジェクトを生成します。
【引数】
Pathes
書き込み可能なフォルダの
返り値
Writable 設定オブジェクト
通常は、サンプル1のように使い、NewWritable 関数の引数を調整します。
もしくは、使っているオブジェクトの
渡すと、書き込み可能なフォルダの設定を不正に変えられる可能性があります。
返り値である Writable 設定オブジェクトは、他の関数に渡すことができます。
AppKey は、なるべく他の関数に渡さないようにしてください。
Sub  Main( Opt, AppKey )
  Set w_= AppKey.NewWritable( Array("out1","out2") ).Enable()
    '// 書き込み可能な範囲
End Sub
サンプル: 複数のフォルダを書き込み可能にする
AppKeyClass は、
NewWritable( "." )
(src)
。文字列、または文字列の配列
関連
サンプル: デスクトップに新規フォルダの作成を可能にし、新規フォルダの中だけ
書き込み可能にする。
新規フォルダを作成することができるフォルダのパスの後に \* を指定してください。
Sub  Main( Opt, AppKey )
  desktop = g_sh.SpecialFolders( "Desktop" )
  Set w_= AppKey.NewWritable( desktop+"\*" ).Enable()
  mkdir  desktop+"\New Folder"
    '// 書き込み可能な範囲
  w_ = Empty  '// これを書かないときは、関数が終わるまでが範囲
End Sub
Pathes に指定するパスの最後に "\*" があると、新規フォルダの作成を可能にし、
新規フォルダの中は書き込み可能にします。 "C:\folder1\*" とすると、C:\folder1
にファイルを作成できませんが、フォルダは作成できます。
すでに C:\folder1 にあるフォルダの中は、上書きされないように、書き込み不可
になります。
が出ないようになります。
本関数を正しく使えば、
テスト
Program Files などの OS のシステムフォルダを NewWritable に指定すると、
System folder access の警告になります。 この警告を自動的に無視するときは、
NewWritable を呼び出す前に
に F_IgnoreIfWarn を指定して、
呼び出してください。
→ T_Writable フォルダ
を使います。
の第2引数である AppKey のクラスです。
の中と、拡張子が
を使う必要はありません。
Cannot overwrite NOT NEW file
このエラーが発生したときは、次のいずれかがエラー メッセージに含まれます。
Cannot overwrite NOT NEW folder
のパスについては、NewWritable
Sub  main2( Opt, AppKey )
  Dim  writable : writable = m.GetWritable
  If not AppKey.InPath( writable, "..\out" ) Then  Error

  Dim w_ : Set w_= AppKey.NewWritable( writable ).Enable()
    '// 書き込み可能な範囲
  w_ = Empty
End Sub
使用サンプル:
Function  ClassA::GetWritable() as array of string
書き込み許可の設定が必要なフォルダーの一覧を取得します。
GetWritable メソッドは、それぞれのクラスで定義してください。
writable
writable
writable
定義サンプル:
Class  ClassA
  Public Function  GetWritable()
    GetWritable = Array( "Work" )
  End Function
End Class
Function  AppKeyClass::InPath( Paths as Array of string, EnablePath as string ) as boolean
サンプル:
Paths に指定したパスの集合が、EnablePath の中に含まれるかどうかを返します。
【引数】
Paths
EnablePath
パスの配列
許可しているパス
返り値
Paths の要素がすべて許可しているパスに含まれているかどうか
ファイル:
vbslib.vbs
(src)
(src)
Sub  AppKeyClass::CheckWritable( Path as string, Opt as variant )
指定したパスが、
【引数】
Path
Opt
チェックするパス
Empty または c.ForMkDir (*1)
されているかどうかチェックします。
(*1)
Path が、Enable (Writables) されていなかったら、
が出ます。
Opt 引数に、g_VBS_Lib.ForMkDir を指定すると、Path に指定したパスの
フォルダーを作るために、Path の子フォルダー(Path より長いパス)だけが、
Enable (Writables) されていたときでも、チェックに引っかからなくなります。
g_AppKey.CheckWritable  "C:\Users\user1\log.txt",  Empty
サンプル
関連
Sub  AppKeyClass::Watch()
Writable の状態を echo 出力します。
サンプル
g_AppKey.Watch
g_AppKey は、公開キーとして用意されているグローバル変数です。
(src)
Function  Writables::Enable() as WritablesStack
書き込み可能なフォルダを設定します。
【引数】
返り値
WritableStack オブジェクト
Writables は、
から取得できます。
返り値の WritableStack オブジェクトが、どこからも参照されなくなったら、書き込み
可能では無くなります。
1つ目の WritableStack が存在するときに、2つ目の Writable::Enable をすると、ネスト
して、2つ目の WritableStack のみ有効になります。 2つ目の WritableStack が参照
されなくなったら、1つ目の WritableStack が有効になります。
Set  w1 = AppKey.NewWritable( "out1" )
Set  w2 = AppKey.NewWritable( "out2" )

Set  w1_ = w1.Enable()

  '// "out1" が書き込み可能

Set  w2_ = w2.Enable()

  '// "out2" が書き込み可能

w2_ = Empty

  '// "out1" が書き込み可能

w1_ = Empty
(src)
関連
  Dim w_:Set w_= AppKey.NewWritable( "." ).Enable()
Sub  SetWritableMode( Mode as integer )
で指定していないフォルダにライトしようとしたときの動きを設定します。
SetWritableMode  F_ErrIfWarn
サンプル
ユーザにライトしていいかどうかを確認します(デフォルト)
E_OutOfWritable エラーにします
警告を無視します(AppKeyClass::SetWritableMode でのみ指定可能)
(src)
    writable_path = env("%ProgramFiles%")+"\SampleApp"
    Assert  InStr( writable_path, "Program Files" ) > 0

    AppKey.SetWritableMode  F_IgnoreIfWarn
    Set w_=AppKey.NewWritable( writable_path ).Enable()
    SetWritableMode  F_AskIfWarn
Sub  AppKeyClass::SetWritableMode( Mode as integer )
関連
サンプル: F_IgnoreIfWarn には、AppKey が必要
Program Files に書き込み許可するときは、以下の手順が最も安全です。
・パスに Program Files が入っていることをチェック
・F_IgnoreIfWarn に設定して警告を抑制して書き込み許可を設定
・F_AskIfWarn に設定を戻す
Dim  g_CurrentWritables.CurrentPathes as array of string
現在書き込みを許可しているパスの配列。
関連
Function  OpenForRead( Path as string ) as TextStream
テキストファイルを開きます。(リード用=ファイルから入力します)
【引数】
Path
返り値
開くファイルのパス
ファイルのストリーム
と異なり、エラーがあったら、
エラーメッセージに Path が付きます。
    Set c = g_VBS_Lib
    Set args = WScript.Arguments.Unnamed

    If args.Count = 0 Then
        path = InputPath( "ファイルのパス >", c.CheckFileExists )
    Else
        path = args(0)
    End If

    Set file = OpenForRead( path )
    Do Until  file.AtEndOfStream
        line = file.ReadLine()
        '// If InStr( line, "DEBUG" ) > 0 Then  echo  line
    Loop
    file = Empty
または
になります。
→ T_File.vbs # [T_OpenFile]
関連
テスト
既定の文字コードを指定します
文字コードを指定するときは、
を使ってください。
ただし、Shift-JIS, Unicode, UTF-8(BOMあり) は、使わなくても自動的に文字コード
を判定して、正しく読み込みます。
  Set cs = new_TextFileCharSetStack( "EUC-JP" )
  Set file = OpenForRead( args(0) )
  cs = Empty
  Do Until  file.AtEndOfStream
    line = file.ReadLine()
  Loop
返り値を使って呼び出せるメソッドは、FileSystemObject::OpenTextFile と同じです。
サンプル
ソース
→ vbslib.vbs
OpenForRead